home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr49
/
303_01.zip
/
PRIN.C
< prev
next >
Wrap
Text File
|
1993-04-01
|
10KB
|
498 lines
/*
* SCCS: %W% %G% %U%
* Print stuff.
*
*EMACS_MODES:c
*/
#include <stdio.h>
#include <a.out.h>
#ifdef COFF
#include <ldfcn.h>
#endif /* COFF */
#include "unc.h"
#define LINELNG 70
void gette(), getde();
long gettw(), getdw();
void prinst();
char noabs; /* No non-global absolutes */
int rel; /* File being analysed is relocatable */
int lpos;
struct commit abstab, comtab;
#ifdef COFF
extern char shlibout;
#endif /* COFF */
/*
* Print absolute and common values.
*/
void pabs()
{
register int i;
register symbol cs;
for (i = 0; i < abstab.c_int; i++)
for (i = 0; i < abstab.c_int; i++) {
cs = abstab.c_symb[i];
#ifdef COFF
if (cs->s_value >= 0x300000 && ! shlibout)
continue;
#endif /* COFF */
if (cs->s_glob)
#ifdef COFF
(void) printf("#\tglobal\t%s\n", cs->s_name);
else if (noabs)
continue;
(void) printf("# %s\t= 0x%lx\n", cs->s_name, cs->s_value);
}
for (i = 0; i < comtab.c_int; i++) {
cs = comtab.c_symb[i];
(void) printf("\tcomm\t%s,%d\n", cs->s_name, cs->s_value);
#else /* !COFF */
(void) printf("\t.globl\t%s\n", cs->s_name);
else if (noabs)
continue;
(void) printf("%s\t=\t0x%lx\n", cs->s_name, cs->s_value);
}
for (i = 0; i < comtab.c_int; i++) {
cs = comtab.c_symb[i];
(void) printf("\t.comm\t%s,%d\n", cs->s_name, cs->s_value);
#endif /* !COFF */
}
}
/*
* Print out labels.
*/
void plabs(ls, seg)
register symbol ls;
int seg;
{
for (; ls != NULL; ls = ls->s_link) {
if (ls->s_type != seg)
continue;
if (ls->s_lsymb) {
#ifdef COFF
(void) printf("L%%%u:\n", ls->s_lsymb);
#else /* !COFF */
(void) printf("%u$:\n", ls->s_lsymb);
#endif /* !COFF */
return; /* Set last */
}
if (ls->s_glob)
#ifdef COFF
(void) printf("\n\tglobal\t%s", ls->s_name);
if (ls->s_name[0] == '.')
(void) printf("\n# %s:\n", ls->s_name);
else
(void) printf("\n%s:\n", ls->s_name);
#else /* !COFF */
(void) printf("\n\t.globl\t%s", ls->s_name);
(void) printf("\n%s:\n", ls->s_name);
#endif /* !COFF */
}
}
/*
* Print out text.
*/
void ptext(fid)
register ef_fid fid;
{
register long tpos, endt;
t_entry tstr;
#ifdef COFF
(void) fputs("\ttext\n", stdout);
#else /* !COFF */
(void) printf(".text\n");
#endif /* !COFF */
tpos = fid->ef_tbase;
endt = tpos + fid->ef_tsize;
contin:
for (; tpos < endt; tpos += tstr.t_lng * 2) {
gette(fid, tpos, &tstr);
#ifdef COFF
plabs(tstr.t_lab, S_TEXT);
#else /* !COFF */
plabs(tstr.t_lab, TEXT);
#endif /* !COFF */
if (tstr.t_type == T_BEGIN)
prinst(&tstr, tpos);
else if (tstr.t_relsymb != NULL) {
#ifdef COFF
(void) printf("\tlong\t%s", tstr.t_relsymb->s_name);
if (tstr.t_relsymb->s_type!=S_TEXT &&
tstr.t_relsymb->s_type!=S_DATA)
#else /* !COFF */
(void) printf("\t.long\t%s", tstr.t_relsymb->s_name);
if (tstr.t_relsymb->s_type!=TEXT &&
tstr.t_relsymb->s_type!=DATA)
#endif /* !COFF */
(void) printf("+0x%x", gettw(fid, tpos, R_LONG));
#ifdef COFF
(void) putchar('\n');
#else /* !COFF */
putchar('\n');
#endif /* !COFF */
tpos += 4;
goto contin;
}
else
#ifdef COFF
(void) printf("\tshort\t0x%x\n", tstr.t_contents);
#else /* !COFF */
(void) printf("\t.word\t0x%x\n", tstr.t_contents);
#endif /* !COFF */
}
/*
* Print out any trailing label.
*/
gette(fid, tpos, &tstr);
#ifdef COFF
plabs(tstr.t_lab, S_TEXT);
#else /* !COFF */
plabs(tstr.t_lab, TEXT);
#endif /* !COFF */
}
/*
* Print out data.
*/
void pdata(fid)
register ef_fid fid;
{
register long dpos, endd;
#ifdef COFF
register int lng, ccnt;
#else /* !COFF */
register int lng;
#endif /* !COFF */
unsigned ctyp;
int had, par, inc;
char *msg;
d_entry dstr;
#ifdef COFF
(void) fputs("\n\tdata\n", stdout);
#else /* !COFF */
(void) printf("\n.data\n");
#endif /* !COFF */
dpos = fid->ef_dbase;
endd = dpos + fid->ef_dsize;
while (dpos < endd) {
getde(fid, dpos, &dstr);
#ifdef COFF
plabs(dstr.d_lab, S_DATA);
#else /* !COFF */
plabs(dstr.d_lab, DATA);
#endif /* !COFF */
switch (dstr.d_type) {
case D_CONT:
(void) fprintf(stderr, "Data sync error\n");
#ifdef COFF
dpos++;
break;
#else /* !COFF */
exit(200);
#endif /* !COFF */
case D_ASC:
case D_ASCZ:
ctyp = dstr.d_type;
lng = dstr.d_lng;
#ifdef COFF
nextline:
(void) fputs("\tbyte\t", stdout);
ccnt=0;
#else /* !COFF */
(void) printf("\t.asci");
if (ctyp == D_ASC)
(void) printf("i\t\"");
else {
(void) printf("z\t\"");
lng--;
}
#endif /* !COFF */
while (lng > 0) {
#ifdef COFF
if (ccnt) (void) putchar(',');
#endif /* COFF */
getde(fid, dpos, &dstr);
switch (dstr.d_contents) {
default:
if (dstr.d_contents < ' ' ||
dstr.d_contents > '~')
#ifdef COFF
ccnt += printf("0x%x", dstr.d_contents);
else {
(void) putchar('\'');
(void)putchar(dstr.d_contents);
ccnt += 2;
}
#else /* !COFF */
(void) printf("\\%.3o", dstr.d_contents);
else
putchar(dstr.d_contents);
#endif /* !COFF */
break;
#ifndef COFF
case '\"':
case '\'':
#endif /* !COFF */
case '\\':
#ifdef COFF
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('\\');
ccnt+=2;
#else /* !COFF */
case '|':
(void) printf("\\%c", dstr.d_contents);
#endif /* !COFF */
break;
case '\b':
#ifdef COFF
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('b');
ccnt+=2;
#else /* !COFF */
(void) printf("\\b");
#endif /* !COFF */
break;
case '\n':
#ifdef COFF
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('n');
ccnt+=2;
#else /* !COFF */
(void) printf("\\n");
#endif /* !COFF */
break;
case '\r':
#ifdef COFF
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('r');
ccnt+=2;
#else /* !COFF */
(void) printf("\\r");
#endif /* !COFF */
break;
#ifdef COFF
case '\f':
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('f');
ccnt+=2;
break;
case '\t':
(void) putchar('\'');
(void) putchar('\\');
(void) putchar('t');
ccnt+=2;
break;
#endif /* COFF */
}
#ifdef COFF
#else /* !COFF */
#endif /* !COFF */
lng--;
dpos++;
#ifdef COFF
if (++ccnt > 40 && lng > 0) {
(void) putchar('\n');
goto nextline;
}
#endif /* COFF */
}
#ifdef COFF
(void) putchar('\n');
#else /* !COFF */
(void) printf("\"\n");
if (ctyp == D_ASCZ)
dpos++;
#endif /* !COFF */
break;
case D_BYTE:
msg = "byte";
par = R_BYTE;
inc = 1;
goto wrest;
case D_WORD:
#ifdef COFF
msg = "short";
#else /* !COFF */
msg = "word";
#endif /* !COFF */
par = R_WORD;
inc = 2;
goto wrest;
case D_LONG:
msg = "long";
par = R_LONG;
inc = 4;
wrest:
#ifdef COFF
(void) putchar('\t');
(void) fputs(msg, stdout);
(void) putchar('\t');
#else /* !COFF */
(void) printf("\t.%s\t", msg);
#endif /* !COFF */
lng = dstr.d_lng;
lpos = 16;
had = 0;
while (lng > 0) {
#ifdef COFF
if (lpos > LINELNG) {
(void) putchar('\n');
(void) putchar('\t');
(void) fputs(msg, stdout);
(void) putchar('\t');
#else /* !COFF */
if (lpos > LINELNG) {
(void) printf("\n\t.%s\t", msg);
#endif /* !COFF */
lpos = 16;
}
#ifdef COFF
else if (had) {
(void) putchar(',');
(void) putchar(' ');
lpos += 2;
}
#else /* !COFF */
else if (had)
lpos += printf(", ");
#endif /* !COFF */
lpos += printf("0x%x", getdw(fid, dpos, par));
lng -= inc;
dpos += inc;
had++;
}
#ifdef COFF
(void) putchar('\n');
#else /* !COFF */
putchar('\n');
#endif /* !COFF */
break;
case D_ADDR:
#ifdef COFF
(void) fputs("\tlong\t", stdout);
#else /* !COFF */
(void) printf("\t.long\t");
#endif /* !COFF */
lng = dstr.d_lng;
lpos = 16;
had = 0;
while (lng > 0) {
if (lpos > LINELNG) {
#ifdef COFF
(void) fputs("\n\tlong\t", stdout);
#else /* !COFF */
(void) printf("\n\t.long\t");
#endif /* !COFF */
lpos = 16;
}
#ifdef COFF
else if (had) {
(void) putchar(',');
(void) putchar(' ');
lpos += 2;
}
#else /* !COFF */
else if (had)
lpos += printf(", ");
#endif /* !COFF */
getde(fid, dpos, &dstr);
lpos += printf("%s", dstr.d_relsymb->s_name);
lng -= sizeof(long);
dpos += sizeof(long);
had++;
}
#ifdef COFF
(void) putchar('\n');
#else /* !COFF */
putchar('\n');
#endif /* !COFF */
break;
}
}
/*
* Print trailing label.
*/
getde(fid, dpos, &dstr);
#ifdef COFF
plabs(dstr.d_lab, S_DATA);
#else /* !COFF */
plabs(dstr.d_lab, DATA);
#endif /* !COFF */
}
void pbss(fid)
register ef_fid fid;
{
register long bpos = fid->ef_bbase;
long endb = fid->ef_end;
d_entry bstr;
#ifdef COFF
(void) fputs("\n# .bss\n", stdout);
while (bpos < endb) {
getde(fid, bpos, &bstr);
plabs(bstr.d_lab, S_BSS);
(void) printf("\tspace\t%d\n", bstr.d_lng);
bpos += bstr.d_lng;
}
getde(fid, endb, &bstr);
plabs(bstr.d_lab, S_BSS);
#else /* !COFF */
(void) printf("\n.bss\n");
while (bpos < endb) {
getde(fid, bpos, &bstr);
plabs(bstr.d_lab, BSS);
(void) printf("\t.space\t%d\n", bstr.d_lng);
bpos += bstr.d_lng;
}
getde(fid, endb, &bstr);
plabs(bstr.d_lab, BSS);
#endif /* !COFF */
}
#ifdef COFF
#endif /* COFF */